package com.gframework.fenci.tree;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Set;

/**
 * 分词查找树数据结构操作接口.
 * 
 * @author Ghwolf
 */
public interface FenciTrieTree {

	/**
	 * 分词处理(采用默认配置)
	 * @param str 要进行分词的字符串
	 * @return 返回分词后的集合结果
	 */
	public Set<String> fenci(String str);
	
	/**
	 * 分词处理(采用默认配置)，不会去重，如果你能保证你的字符串不存在重复的词语或者能够容错重复，那么可以使用此方法以得到更快的性能。
	 * @param str 要进行分词的字符串
	 * @return 返回分词后的集合结果
	 */
	public List<String> fenciToList(String str);
	
	/**
	 * 分词处理
	 * @param str 要进行分词的字符串
	 * @param config 分词配置
	 * @return 返回分词后的集合结果
	 */
	public Set<String> fenci(String str,Config config);
	/**
	 * 分词处理，不会去重，如果你能保证你的字符串不存在重复的词语或者能够容错重复，那么可以使用此方法以得到更快的性能。
	 * @param str 要进行分词的字符串
	 * @param config 分词配置
	 * @return 返回分词后的集合结果
	 */
	public List<String> fenciToList(String str,Config config);
	
	/**
	 * 获取词汇总数
	 * @return 返回词汇总数
	 */
	public long wordSize() ;
	
	/**
	 * 获取易混淆字数
	 * @return 返回易混淆字数
	 */
	public long errorProneWordSize() ;
	
	/**
	 * 获取次接口对象，需要注意的时，调用此方法会获取到一个全新的接口对象，
	 * 通常来说只需要一个就够了，因此只需要调用一次而后复用该对象即可。
	 */
	public static FenciTrieTree build(){
		try (InputStream wordInput = FenciTrieTree.class.getResource("/com/gframework/fenci/db/word.txt").openStream();
				InputStream errorProneWordInput = FenciTrieTree.class.getResource("/com/gframework/fenci/db/error-prone-word.txt").openStream();){
			return FenciTrieTreeBuilder.buildByInputStream(wordInput, errorProneWordInput, "UTF-8");
		} catch (IOException e) {
			throw new IllegalStateException("分词树初始化失败！",e);
		}
	}
	
}
